home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
3_0
/
PICTXCMD
/
XCMD.C
< prev
Wrap
C/C++ Source or Header
|
1988-03-12
|
12KB
|
482 lines
#include "HyperXCMD.h"
/*
Convert a boolean to 'true' or 'false'. Instead of returning
a new string, as Pascal does, it expects you to create mystr
and pass it in to be filled.
*/
pascal void
BoolToStr(paramPtr,bool,mystr)
register XCmdBlockPtr paramPtr;
Boolean bool;
Str31 mystr;
{
paramPtr->inArgs[0] = (long)bool;
paramPtr->inArgs[1] = (long)mystr;
paramPtr->request = xreqBoolToStr;
(*paramPtr->entryPoint)();
}
/*
Evaluate a HyperCard expression and return the answer. The answer is
a handle to a zero-terminated string.
*/
pascal Handle
EvalExpr(paramPtr,expr)
register XCmdBlockPtr paramPtr;
StringPtr expr;
{
paramPtr->inArgs[0] = (long)expr;
paramPtr->request = xreqEvalExpr;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
Original comment:
Convert an extended long integer to decimal digits in a string.
Instead of returning a new string, as Pascal does, it expects
you to create mystr and pass it in to be filled.
*/
/*
My comment:
I assume that an extended is supposed to be an 80-byte double,
which is declared as double in LSC. I've changed "extended" to
"double" to reflect this
*/
pascal void
ExtToStr(paramPtr,myext,mystr)
register XCmdBlockPtr paramPtr;
double * myext;
Str31 mystr;
{
paramPtr->inArgs[0] = (long)myext;
paramPtr->inArgs[1] = (long)mystr;
paramPtr->request = xreqExtToStr;
(*paramPtr->entryPoint)();
}
/*
Return a handle to a zero-terminated string containing the value of
the field whise ID is fieldID. You must dispose of the handle.
*/
pascal Handle
GetFieldByID(paramPtr,cardFieldFlag,fieldID)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
short fieldID;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = fieldID;
paramPtr->request = xreqGetFieldByID;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
Return a handle to a zero-terminated string containing the value of
field fieldName on the current card. You must dispose the handle.
*/
pascal Handle
GetFieldByName(paramPtr,cardFieldFlag,fieldName)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
StringPtr fieldName;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = (long)fieldName;
paramPtr->request = xreqGetFieldByName;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
Return a handle to a zero-terminated string containing the value of
field fieldNum on the current card. You must dispose of the handle.
*/
pascal Handle
GetFieldByNum(paramPtr, cardFieldFlag,fieldNum)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
short fieldNum;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = fieldNum;
paramPtr->request = xreqGetFieldByNum;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
Return a handle to a zero-terminated string containing the value of
the specified HyperTalk global variable.
*/
pascal Handle
GetGlobal(paramPtr,globName)
register XCmdBlockPtr paramPtr;
StringPtr globName;
{
paramPtr->inArgs[0] = (long)globName;
paramPtr->request = xreqGetGlobal;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
Convert an unsigned long integer to a Pascal string. Instead of
returning a new string, as Pascal does, it expects you to
create mystr and pass it in to be filled.
*/
pascal void
LongToStr(paramPtr, posNum, mystr)
register XCmdBlockPtr paramPtr;
long posNum;
Str31 mystr;
{
paramPtr->inArgs[0] = posNum;
paramPtr->inArgs[1] = (long)mystr;
paramPtr->request = xreqLongToStr;
(*paramPtr->entryPoint)();
}
/*
Convert an unsigned long integer to a hexadecimal number and put it
into a Pascal string. Instead of returning a new string, as Pascal
does, it expects you to create mystr and pass it in to be filled.
*/
pascal void
NumToHex(paramPtr, num, nDigits, mystr)
register XCmdBlockPtr paramPtr;
long num;
short nDigits;
Str31 mystr;
{
paramPtr->inArgs[0] = num;
paramPtr->inArgs[1] = nDigits;
paramPtr->inArgs[2] = (long)mystr;
paramPtr->request = xreqNumToHex;
(*paramPtr->entryPoint)();
}
/*
Convert a signed long integer to a Pascal string. Instead of
returning a new string, as Pascal does, it expects you to
create mystr and pass it in to be filled.
*/
pascal void
NumToStr(paramPtr,num,mystr)
register XCmdBlockPtr paramPtr;
long num;
Str31 mystr;
{
paramPtr->inArgs[0] = num;
paramPtr->inArgs[1] = (long)mystr;
paramPtr->request = xreqNumToStr;
(*paramPtr->entryPoint)();
}
/*
Convert a Pascal string to a zero-terminated string. Returns a handle
to a new zero-terminated string. The caller must dispose the handle.
You'll need to do this for any result or argument you send from
your XCMD to HyperTalk. Note that if you use C-format strings,
you won't need to do this from C.
*/
pascal Handle
PasToZero(paramPtr,pasStr)
register XCmdBlockPtr paramPtr;
StringPtr pasStr;
{
paramPtr->inArgs[0] = (long)pasStr;
paramPtr->request = xreqPasToZero;
(*paramPtr->entryPoint)();
return (Handle)paramPtr->outArgs[0];
}
/*
zeroStr points into a zero-terminated string. Collect the
characters from there to the next carriage Return and return
them in the Pascal string pasStr. If a Return is not found,
collect chars until the end of the string.
*/
pascal void
ReturnToPas(paramPtr,zeroStr,pasStr)
register XCmdBlockPtr paramPtr;
Ptr zeroStr;
StringPtr pasStr;
{
paramPtr->inArgs[0] = (long)zeroStr;
paramPtr->inArgs[1] = (long)pasStr;
paramPtr->request = xreqReturnToPas;
(*paramPtr->entryPoint)();
}
/*
Move the pointer scanPtr along a zero-terminated
string until it points at a Return character
or a zero byte.
*/
pascal void
ScanToReturn(paramPtr,scanHndl)
register XCmdBlockPtr paramPtr;
Ptr * scanHndl;
{
paramPtr->inArgs[0] = (long)scanHndl;
paramPtr->request = xreqScanToReturn;
(*paramPtr->entryPoint)();
}
/*
Move the pointer scanPtr along a zero-terminated
string until it points at a zero byte.
*/
pascal void
ScanToZero(paramPtr,scanHndl)
register XCmdBlockPtr paramPtr;
Ptr * scanHndl;
{
paramPtr->inArgs[0] = (long)scanHndl;
paramPtr->request = xreqScanToZero;
(*paramPtr->entryPoint)();
}
/*
Send a HyperCard message (a command with arguments) to the current card.
msg is a pointer to a Pascal-format string.
*/
pascal void
SendCardMessage(paramPtr, msg)
register XCmdBlockPtr paramPtr;
StringPtr msg;
{
paramPtr->inArgs[0] = (long)msg;
paramPtr->request = xreqSendCardMessage;
(*paramPtr->entryPoint)();
}
/*
Set the value of the field whose ID is fieldID to be the zero-
terminated string in fieldVal. The contents of the Handle are
copied, so you must still dispose it afterwards.
*/
pascal void
SetFieldByID(paramPtr,cardFieldFlag,fieldID,fieldVal)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
short fieldID;
Handle fieldVal;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = fieldID;
paramPtr->inArgs[2] = (long)fieldVal;
paramPtr->request = xreqSetFieldByID;
(*paramPtr->entryPoint)();
}
/*
Set the value of field fieldName to be the zero-terminated string
in fieldVal. The contents of the Handle are copied, so you must
still dispose it afterwards.
*/
pascal void
SetFieldByName(paramPtr,cardFieldFlag,fieldName,fieldVal)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
StringPtr fieldName;
Handle fieldVal;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = (long)fieldName;
paramPtr->inArgs[2] = (long)fieldVal;
paramPtr->request = xreqSetFieldByName;
(*paramPtr->entryPoint)();
}
/*
Set the value of field fieldNum to be the zero-terminated string
in fieldVal. The contents of the Handle are copied, so you must
still dispose it afterwards.
*/
pascal void
SetFieldByNum(paramPtr,cardFieldFlag,fieldNum,fieldVal)
register XCmdBlockPtr paramPtr;
Boolean cardFieldFlag;
short fieldNum;
Handle fieldVal;
{
paramPtr->inArgs[0] = (long)cardFieldFlag;
paramPtr->inArgs[1] = fieldNum;
paramPtr->inArgs[2] = (long)fieldVal;
paramPtr->request = xreqSetFieldByNum;
(*paramPtr->entryPoint)();
}
/*
Set the value of the specified HyperTalk global variable to be
the zero-terminated string in globValue. The contents of the
Handle are copied, so you must still dispose it afterwards.
*/
pascal void
SetGlobal(paramPtr,globName,globValue)
register XCmdBlockPtr paramPtr;
StringPtr globName;
Handle globValue;
{
paramPtr->inArgs[0] = (long)globName;
paramPtr->inArgs[1] = (long)globValue;
paramPtr->request = xreqSetGlobal;
(*paramPtr->entryPoint)();
}
/*
Return true if the two strings have the same characters.
Case insensitive compare of the strings.
*/
pascal Boolean
StringEqual(paramPtr,str1,str2)
register XCmdBlockPtr paramPtr;
unsigned char * str1;
unsigned char * str2;
{
paramPtr->inArgs[0] = (long)str1;
paramPtr->inArgs[1] = (long)str2;
paramPtr->request = xreqStringEqual;
(*paramPtr->entryPoint)();
return (Boolean)paramPtr->outArgs[0];
}
/*
Count the characters from where strPtr points until the next zero byte.
Does not count the zero itself. strPtr must be a zero-terminated string.
*/
pascal long
StringLength(paramPtr,strPtr)
register XCmdBlockPtr paramPtr;
StringPtr strPtr;
{
paramPtr->inArgs[0] = (long)strPtr;
paramPtr->request = xreqStringLength;
(*paramPtr->entryPoint)();
return paramPtr->outArgs[0];
}
/*
Perform case-insensitive match looking for pattern anywhere in
target, returning a pointer to first character of the first match,
in target or NIL if no match found. pattern is a Pascal string,
and target is a zero-terminated string.
*/
pascal Ptr
StringMatch(paramPtr, pattern, target)
register XCmdBlockPtr paramPtr;
StringPtr pattern;
Ptr target;
{
paramPtr->inArgs[0] = (long)pattern;
paramPtr->inArgs[1] = (long)target;
paramPtr->request = xreqStringMatch;
(*paramPtr->entryPoint)();
return (Ptr)paramPtr->outArgs[0];
}
/*
Convert the Pascal strings 'true' and 'false' to booleans.
*/
pascal Boolean
StrToBool(paramPtr,str)
register XCmdBlockPtr paramPtr;
Str31 str;
{
paramPtr->inArgs[0] = (long)str;
paramPtr->request = xreqStrToBool;
(*paramPtr->entryPoint)();
return (Boolean)paramPtr->outArgs[0];
}
/*
Original comment:
Convert a string of ASCII decimal digits to an extended long integer.
Instead of returning a new extended, as Pascal does, it expects you
to create myext and pass it in to be filled.
*/
/*
My comment: extended, as far as I know, is an 80-bit double, not a
long integer. Since LSC doubles are 80-bit, I've changed myext to
a pointer to a double.
*/
pascal void StrToExt(paramPtr, str, myext)
register XCmdBlockPtr paramPtr;
Str31 str;
double * myext;
{
paramPtr->inArgs[0] = (long)str;
paramPtr->inArgs[1] = (long)myext;
paramPtr->request = xreqStrToExt;
(*paramPtr->entryPoint)();
}
/*
Convert a string of ASCII decimal digits to an unsigned long integer.
*/
pascal long
StrToLong(paramPtr, strPtr)
register XCmdBlockPtr paramPtr;
Str31 strPtr;
{
paramPtr->inArgs[0] = (long)strPtr;
paramPtr->request = xreqStrToLong;
(*paramPtr->entryPoint)();
return (long)paramPtr->outArgs[0];
}
/*
Convert a string of ASCII decimal digits to a signed long integer.
Negative sign is allowed.
*/
pascal long
StrToNum(paramPtr, str)
register XCmdBlockPtr paramPtr;
Str31 str;
{
paramPtr->inArgs[0] = (long)str;
paramPtr->request = xreqStrToNum;
(*paramPtr->entryPoint)();
return paramPtr->outArgs[0];
}
/*
Write zeros into memory starting at destPtr and going for longCount
number of bytes.
*/
pascal void
ZeroBytes(paramPtr, dstPtr, longCount)
register XCmdBlockPtr paramPtr;
Ptr dstPtr;
long longCount;
{
paramPtr->inArgs[0] = (long)dstPtr;
paramPtr->inArgs[1] = longCount;
paramPtr->request = xreqZeroBytes;
(*paramPtr->entryPoint)();
}
/*
Fill the Pascal string with the contents of the zero-terminated
string. Useful for converting the arguments of any XCMD to
Pascal strings.
*/
pascal void
ZeroToPas(paramPtr,zeroStr,pasStr)
register XCmdBlockPtr paramPtr;
unsigned char *zeroStr;
StringPtr pasStr;
{
paramPtr->inArgs[0] = (long)zeroStr;
paramPtr->inArgs[1] = (long)pasStr;
paramPtr->request = xreqZeroToPas;
(*paramPtr->entryPoint)();
}